/* 
魔术索引。 在数组A[0...n-1]中，有所谓的魔术索引，满足条件A[i] = i。给定一个有序整数数组，
编写一种方法找出魔术索引，若有的话，在数组A中找出一个魔术索引，如果没有，则返回-1。若有多个魔术索引，返回索引值最小的一个。


输入：nums = [0, 2, 3, 4, 5]
输出：0
说明: 0下标的元素为0


思路1：遍历一遍直接查找
思路2：有序数组查找，用二分法，但是数组中可能有多个魔术索引，所以找到一个后要继续找到索引最小的，利用分治(递归)
在某些情况下思路2优于思路1
*/
// /**
//  * @param {number[]} nums
//  * @return {number}
//  */
//  var findMagicIndex = function(nums) {
//     const len=nums.length
//     let left=0,right=len-1
//     let mid=0
    
// };




function findMagicIndex(nums) {
    return getAnswer(nums, 0, nums.length - 1);
}

function getAnswer(nums, left, right) {
    console.log(left,right);
    // 确定退出递归条件
    if (left > right) {
        return -1;
    }
    // 获取中间索引
    let mid = Math.floor((right - left) / 2) + left;
    // 先去左侧数组查找
    let leftAnswer = getAnswer(nums, left, mid - 1);  // 0 1  0 -1
    console.log('leftAnswer',leftAnswer);
    // 左侧数组中找到了就返回
    if (leftAnswer != -1) {
        return leftAnswer;
    } else if (nums[mid] == mid) {
        // 没找到的话判断mid所在项是否满足
        return mid;
    }
    // 去右数组查找
    return getAnswer(nums, mid + 1, right);
} 



let nums = [1, 2, 3, 3, 4]
let res = findMagicIndex(nums)
// console.log(res);